package direct;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.Connection;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import common.ContantsConfig;

import java.io.IOException;

/**
 *
 * DIRECT交换器：利用route Key交换到bind key队列上面，该队列绑定的是一个channel。
 *
 */
public class Consumer {



    public static void main(String[] args) throws IOException {
        //端口默认使用5672
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory(ContantsConfig.MQ_HOST);
        //由于rabbitmq默认guest用户,只能使用localhost登录, 所以创建了admin用户, 角色是administrator, 指派vhost是/(斜杠是默认的vhost)
        connectionFactory.setUsername(ContantsConfig.USER);
        connectionFactory.setPassword(ContantsConfig.PASSWORD);

        Connection connection = connectionFactory.createConnection();



        /**
         *创建一个新的通道, 不支持事务, true表示支持
         */
        Channel channel = connection.createChannel(false);



        /**
         * DIRECT交换器：利用route Key交换到bind key队列上面，该队列绑定的是一个channel。
         *
         *声明交换器（双方都要声明）
         *你可能会发现又一次声明了交换器, 这是预防使用queue_bind时候出错, 重复声明一样名字的交换器, 并不会发生任何操作
         *
         * 参数：
         * exchange 交换器名 , BuiltinExchangeType 交换器类型, durable   是否持久化 ,
         * autoDelete 自动删除（无消费者，自动删除）
         */
        channel.exchangeDeclare("hello-exchange", BuiltinExchangeType.DIRECT, true, false, null);




        /**
         * 声明队列
         * 参数：
         * queue 队列名 ,  durable 持久化的队列,
         * exclusive 私有的，同个程序生产、消费 , autoDelete 自动删除，当没有消费者 , Map<String, Object> arguments
         */
        channel.queueDeclare("hello-queue", true, true, false, null);



        /**
         * 将队列和交换器绑定 ("队列", "交换器", "route key 该channel绑定的bind key")
         */
        channel.queueBind("hello-queue", "hello-exchange", "hola");



        /**
         * 声明容器，监听队列名
         */
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
        container.setQueueNames("hello-queue");
        container.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                System.out.println(message);
            }
        });
        container.start();
    }
}
